package com.jeff.work;

/**
 * 朗致集团线上测试coding的Node类
 *
 * @param <T> {@Description} 说明
 *            {@Author} <b style="color:yellow">yaojianfeng</b> 2024/6/15 下午3:44
 */
public class Node<T> {
    private T val;
    private Node<T> right;
    private Node<T> left;
    private Node<T> parent;


    //一个方法,这个方法的作用是生成一个满二叉树,即每个节点都有左右子树,
    // 并且这个方法接受一个int类型的数字,这个数字代表的是二叉树的层数
    // 这个方法的返回值是一个Node类型的对象,这个对象代表的是根节点
    // 这个方法的实现思路是,如果当前层数等于1,则生成一个节点,并将这个节点的值设置为val,然后返回这个节点
    // 如果当前层数大于1,则生成一个节点,并将这个节点的值设置为1,然后递归的生成它的左右子树,左右子树的层数减一,
    // 然后将左右子树的根节点设置为这个节点的左右子树,然后返回这个节点
    // 这个方法的泛型参数T是为了适应不同的类型,比如可以是Integer,String等等
    // 这个方法的返回值是一个Node<T>类型的对象,因为我们希望返回的节点的类型和传入的类型一致
    //这个方法在对节点进行赋值的时候,将按照自然数的递增顺序对每层的节点进行赋值,比如根节点为1,左子树为2,
    // 右子树为3,左子树的左子树为4,左子树的右子树为5,右子树的左子树为6,右子树的右子树为7
    // 这样可以保证生成的二叉树是满二叉树,并且节点的值是按照自然数的递增顺序进行赋值的
    private static <T> Node<T> generateFullBinaryTree(int depth, int currentValue) {
        if (depth == 1) {
            Node<T> node = new Node<>();
            node.val = (T) Integer.valueOf(currentValue);
            return node;
        }

        Node<T> node = new Node<>();
        node.val = (T) Integer.valueOf(currentValue);

        node.left = generateFullBinaryTree(depth - 1, currentValue * 2);
        node.right = generateFullBinaryTree(depth - 1, currentValue * 2 + 1);

        return node;
    }

    public static void main(String[] args) {

        Node<Integer> root = generateFullBinaryTree(4, 1);
        System.out.println(root.val);
    }


}
